#!/usr/bin/python
import sys, os, re, time, shutil
################################################################################
################################################################################
class Params:
   verbose = True
   cleanup = True
   trial   = False
   def __init__( self ):
      
      dagMtxHomeEnvName = 'DAGMTX_HOME_DIR'
      
      if not dagMtxHomeEnvName in os.environ:
         print 'Before using ' + sys.argv[0] + ', you need to set the environment variable "' + dagMtxHomeEnvName + '"'
         print 'to point to the home directory for this project.'
         sys.exit( -1 )
      
      self.dagHomeDir = os.environ[ dagMtxHomeEnvName ]
      
      self.tmpHome = os.path.join( self.dagHomeDir, 'tmp' )
      self.tarHome = os.path.join( self.tmpHome, 'dagmtx' )
   

################################################################################
################################################################################
def PrintTimeStamp():
   theTime = time.localtime()
   yr  = '%04d' % theTime.tm_year
   mon = '%02d' % theTime.tm_mon
   day = '%02d' % theTime.tm_mday
   hr  = '%02d' % theTime.tm_hour
   mt  = '%02d' % theTime.tm_min
   sec = '%02d' % theTime.tm_sec
   print '...', '/'.join( [yr, mon, day] ), ':'.join( [hr, mt, sec] )
   sys.stdout.flush()

def SystemWrapperPipelined( cmd, verbose, trial = False ):
   if verbose:
      PrintTimeStamp()
      print '... os.popen(', cmd, ')'
      sys.stdout.flush()
   if not trial:
      FH = os.popen( cmd )
      output = [ line.rstrip() for line in FH.readlines() ]
      FH.close()
      return output
   return []

def SystemWrapper( cmd, verbose, trial = False ):
   dt = 0
   if verbose:
      PrintTimeStamp()
      print '... os.system(', cmd, ')'
      sys.stdout.flush()
   if trial:
      status = 0
   else:
      t0 = time.time()
      status = os.system( cmd )
      t1 = time.time()
      dt = t1 - t0
   assert status == 0
   if verbose:
      print '...', dt, 'seconds elapsed during system call.'
   return dt

def RemoveWrapper( fn, verbose, trial = False ):
	if verbose:
		PrintTimeStamp()
		print '... os.remove(', fn, ')'
		sys.stdout.flush()
	if not trial:
		os.remove( fn )

################################################################################
################################################################################
def ReadFileLines( file ):
   # opens a file
   # returns the contents as a list of lines in the file
   # trailing new-line chars are removed
   FH = open( file, 'r' )
   lines = [ line.rstrip() for line in FH.readlines() ]
   FH.close()
   return lines

################################################################################
################################################################################
def CopyRepoToTmpPath( params ):
   cmd   = 'hg status --all'
   lines = SystemWrapperPipelined( cmd, params.verbose, trial = params.trial )
   
   for line in lines:
      toks = line.split()
      if toks[0] in [ 'A', 'M', '?' ]:
         print line
         print '-----------------------------'
         print 'can only tarball a clean repo'
         print '-----------------------------'
         assert False
      assert toks[0] in [ 'C', 'I' ]
      if toks[0] == 'C':
         src = os.path.join( params.dagHomeDir, toks[1] )
         dst = os.path.join( params.tarHome,    toks[1] )
         ( dstp, dstf ) = os.path.split( dst )
         if not os.path.isdir( dstp ):
            os.makedirs( dstp )
         assert os.path.isdir( dstp )
         shutil.copy( src, dst )

def MakeTarBall( params, version ):
   os.chdir( params.tmpHome )
   cmd = 'tar cvfj dagmtx-%s.tar.bz2 dagmtx' % version
   SystemWrapper( cmd, params.verbose, trial = params.trial )

def Cleanup( params ):
   if params.cleanup:
      shutil.rmtree( params.tarHome )

################################################################################
################################################################################
if len( sys.argv ) < 2:
   ( progPath, progName ) = os.path.split( sys.argv[0] )
   print 'Usage:', progName, '<versionNumber>'
   sys.exit( -1 )

version = sys.argv[1]
params  = Params()

CopyRepoToTmpPath( params )
MakeTarBall( params, version )
Cleanup( params )
